package juc.thread_stop;

/**
 *
 * 利用中断机制优雅的停止线程:
 * while (!Thread.currentThread().isInterrupted() && more work to do) {
 *                do more work
 *    }
 *   注意：使用中断机制时一定要注意是否存在中断标志位被清除的情况
 */
public class InterruptStop {

    public static void main(String[] args) throws InterruptedException {
//        demo1();
        demo2();
    }

    /**
     * 中断后t1执行完毕后程序立即停止
     *
     * @throws InterruptedException
     */
    private static void demo1() throws InterruptedException {
        Thread t1 = new Thread(() -> {
            int i = 0;
            while (!Thread.currentThread().isInterrupted() && i < 1000) {
                i++;
                System.out.println("i=" + i);
            }
            System.out.println("执行完毕，i=" + i);
        });
        t1.start();
        // 执行一段时间
        Thread.sleep(5);
        // 中断线程
        t1.interrupt();
        System.out.println("中断t1线程");
    }

    /**
     * 处于休眠中的线程被中断，线程是可以感受到中断信号的，并且会抛出一个 InterruptedException 异常，同时清除中断信号，将中断标记位设置成 false。
     * 这样就会导致while条件Thread.currentThread().isInterrupted()为false，程序会在不满足count < 1000这个条件时退出。
     * 如果不在catch中重新手动添加中断信号，不做任何处理，就会屏蔽中断请求，有可能导致线程无法正确停止。
     * @throws InterruptedException
     */
    private static void demo2() throws InterruptedException {
        Thread t1 = new Thread(() -> {
            int i = 0;
            while (!Thread.currentThread().isInterrupted() && i < 1000) {
                i++;
                System.out.println("i=" + i);

                try {
                    //
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    // 会抛出中断异常，同时清除中断信号，将中断标记位设置成 false。
                    e.printStackTrace();
                    // 重点:需要重新设置线程中断状态为true
//                    Thread.currentThread().interrupt();
                }
            }
            System.out.println("执行完毕，i=" + i);
        });

        t1.start();
        // 执行一段时间
        Thread.sleep(5);
        // 中断线程
        t1.interrupt();
        System.out.println("中断t1线程");
    }

}
